#include "T_Player.h"

#include <QTime>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QHeaderView>
#include <QPushButton>
#include <QMessageBox>
#include <QDir>
#include <QDebug>
#include <QAbstractItemView>
#include <QtConcurrent>
#include <qdatetime.h>
#include "ElaTableView.h"
#include "ElaScrollBar.h"
#include "T_TableViewModel.h"
#include "T_PlayerCaptionModel.h"
#include "T_KeyFrameTableViewModel.h"
#include "KeyFrameExtractor.h" 
#include "whisper_processor.h"
#include "mainwindow.h"  // 需要包含 MainWindow 以访问 whisper

T_Player::T_Player(QWidget* parent)
: T_BasePage(parent)
{
    //获取 MainWindow 里的 whisper,现在不要了重开一个whisper
    MainWindow* mainWin = qobject_cast<MainWindow*>(this->window());
    if (mainWin) {
        whisper = mainWin->getWhisper();  // 确保 MainWindow 里有 getWhisper() 方法
    }


   connect(whisper->m_worker, &WhisperWorker::videoProcessingFinished,
           this, &T_Player::onSubtitlesReady, Qt::QueuedConnection);
   // —— 5) 出错时恢复按钮 —— 
   connect(whisper->m_worker, &WhisperWorker::errorOccurred,
           this, [this](const QString &err){
               QMessageBox::critical(this, "字幕提取失败", err);
               btnExtractSubtitles->setEnabled(true);
           }, Qt::QueuedConnection);
   // …（后续把“提取字幕”按钮点下去后，走 QtConcurrent::run(processVideoAudio)）…

    setWindowTitle("视频分析");
    setTitleVisible(false);

    // 主容器和主水平布局
    QWidget* mainWidget = new QWidget(this);
    mainWidget->setWindowTitle("视频分析");
    QHBoxLayout* mainLayout = new QHBoxLayout(mainWidget);
    mainLayout->setContentsMargins(0, 0, 0, 0);  // 移除边距
    mainLayout->setSpacing(5);                   // 设置左右区域间距

    // ================== 左侧区域 ==================
    QWidget* leftContainer = new QWidget(mainWidget);

    // 在 leftContainer 中添加一个按钮，用于提取关键帧
    btnExtractKeyFrame = new QPushButton("提取关键帧", leftContainer);
    btnExtractSubtitles   = new QPushButton("提取字幕", leftContainer);

    QHBoxLayout* buttonRowLayout = new QHBoxLayout;
    buttonRowLayout->addWidget(btnExtractKeyFrame);
    buttonRowLayout->addWidget(btnExtractSubtitles);

    QVBoxLayout* leftLayout = new QVBoxLayout(leftContainer);
    leftLayout->setContentsMargins(0, 0, 0, 0);
    leftLayout->setSpacing(5);
    leftLayout->addLayout(buttonRowLayout);

    // 左上：播放器控件
    _player = new Player(leftContainer);
    leftLayout->addWidget(_player, 7);  // 7: 播放器区域占左侧高度的7/10

    // 当用户打开视频后，保存当前视频路径
    connect(_player, &Player::videoFileSelected, this, [=](const QString &videoPath) {
        m_currentVideoPath = videoPath;
        qDebug() << "当前视频路径:" << m_currentVideoPath;
    });


    // 左下：进度条 + 关键帧表格

    _tableView = new ElaTableView(leftContainer);
    _tableView->setModel(new T_KeyFrameTableViewModel(this));
    // —— 把“提取关键帧”换成后台线程版 —— 
   // 1) 每次点击禁掉按钮、置零进度    
  // —— 把“提取关键帧”改成后台线程版本 —— 
    connect(btnExtractKeyFrame, &QPushButton::clicked, this, [this]() {
        if (m_currentVideoPath.isEmpty()) {
            QMessageBox::warning(this, "提示", "请先选择视频文件！");
            return;
        }
        // 禁用按钮 & 清表格 & 进度“忙碌”
        btnExtractKeyFrame->setEnabled(false);
        if (auto mw = qobject_cast<MainWindow*>(this->window())) {
            mw->globalProgressBar()->running();
        }

        static_cast<T_KeyFrameTableViewModel*>(_tableView->model())->clearData();

        // 交给 QtConcurrent
        QFuture< QVector<T_KeyFrameTableViewModel::KeyFrameItem> > future =
            QtConcurrent::run([this]() {
            KeyFrameExtractor extractor;
            return extractor.extractKeyFrames(
                m_currentVideoPath,
                QDir::tempPath() + "/keyframes");
                });
        m_kfWatcher.setFuture(future);
        });
    
    // 连接 _tableView 的 clicked 信号到 onKeyFrameClicked 槽
    connect(_tableView, &QAbstractItemView::clicked, this, &T_Player::onKeyFrameClicked);

    // ================== 关键帧专业级视觉配置 ==================
    // 表头字体设置
    QFont tableHeaderFont = _tableView->horizontalHeader()->font();
    tableHeaderFont.setPixelSize(14);
    tableHeaderFont.setWeight(QFont::Medium);
    _tableView->horizontalHeader()->setFont(tableHeaderFont);

    // 影视级色彩方案
    _tableView->setStyleSheet(R"(
                              ElaTableView {
                              background: #1E1E1E;
                              alternate-background-color: #2D2D2D;
                              gridline-color: #404040;
                              }
                              QHeaderView::section {
                              background: #252526;
                              color: #D4D4D4;
                              padding: 8px 12px;
                              border: none;
                              }
                              )");

    // ================== 数据展示优化 ==================
    _tableView->setAlternatingRowColors(true);
    _tableView->verticalHeader()->setHidden(true);

    // ================== 列宽策略（影视标准布局） ==================
    _tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);  // 关键帧缩略图列固定
    _tableView->setColumnWidth(0, 240);  // 匹配16:9比例缩略图（240x135）

    _tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); // 分析列自适应

    // ================== 行高控制 ==================
    _tableView->verticalHeader()->setDefaultSectionSize(135);  // 匹配16:9缩略图高度
    _tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);

    // ================== 交互优化 ==================
    _tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    _tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    _tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);

    // ================== 性能优化 ==================
    // _tableView->setViewportMargins(0, 2, 0, 2);  // 增加垂直呼吸空间
    _tableView->setIconSize(QSize(240, 135));    // 预加载缩略图尺寸
    leftLayout->addWidget(_tableView, 3);  // 3: 列表占左侧高度的3/10

    // ================== 右侧区域 ==================
    QWidget* rightContainer = new QWidget(mainWidget);
    QVBoxLayout* rightLayout = new QVBoxLayout(rightContainer);
    rightLayout->setContentsMargins(0, 0, 0, 0);
    rightLayout->setSpacing(10);                   // 控件间距

    // 右侧分析列表
    _playerSubtitleView = new ElaTableView(this);

    // 字体设置
    QFont caption_tableHeaderFont = _playerSubtitleView->horizontalHeader()->font();
    caption_tableHeaderFont.setPixelSize(16);
    _playerSubtitleView->horizontalHeader()->setFont(caption_tableHeaderFont);

   // 模型设置
   m_captionModel = new T_PlayerCaptionModel(this);
   _playerSubtitleView->setModel(m_captionModel);
   
    // 初始化示例数据（时间戳递增演示）
    QDateTime baseTime(QDate::currentDate(), QTime::currentTime());
    m_captionModel->m_data = {
    {baseTime, "医生：最近胸痛发作的频率有增加吗？"},
    {baseTime.addSecs(5), "患者：从每周两次变成每天都会疼..."},
    {baseTime.addSecs(10), "医生：CT显示冠状动脉有60%狭窄（展示平板）"},
    {baseTime.addSecs(15), "患者：这...是不是必须做支架了？"},
    {baseTime.addSecs(20), "医生：我们先尝试药物溶栓治疗"},
    {baseTime.addSecs(25), "护士：准备500U肝素静脉滴注"},
    {baseTime.addSecs(30), "心电监护：ST段回落＞50%"}
    };

    // 自适应核心配置
    _playerSubtitleView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); // 时间列
    _playerSubtitleView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);         // 内容列
    _playerSubtitleView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);              // 尺寸策略

    // 优化显示配置
    _playerSubtitleView->setAlternatingRowColors(true);
    _playerSubtitleView->setIconSize(QSize(38, 38));
    _playerSubtitleView->verticalHeader()->setHidden(true);
    _playerSubtitleView->setSelectionBehavior(QAbstractItemView::SelectRows);
    _playerSubtitleView->horizontalHeader()->setMinimumSectionSize(100);  // 时间列最小宽度
    _playerSubtitleView->verticalHeader()->setMinimumSectionSize(36);   // 最小行高
    _playerSubtitleView->verticalHeader()->setDefaultSectionSize(36);    // 默认行高
    rightLayout->addWidget(_playerSubtitleView);

    // 字幕连接按钮点击信号
    connect(btnExtractSubtitles, &QPushButton::clicked, this, &T_Player::onExtractSubtitlesClicked);
    connect(_playerSubtitleView, &QAbstractItemView::clicked, this, &T_Player::onCaptionClicked);

    // QListWidget* analysisListRight = new QListWidget(rightContainer);
    // analysisListRight->setStyleSheet("background: #f8f8f8;");
    // analysisListRight->addItems({"详细分析A", "详细分析B", "详细分析C"});
    // rightLayout->addWidget(analysisListRight);

    // ================== 布局组合 ==================
    mainLayout->addWidget(leftContainer, 2);   // 左侧占2/3宽度
    mainLayout->addWidget(rightContainer, 1);  // 右侧占1/3宽度

    // 添加到基类布局
    addCentralWidget(mainWidget, true, false, 1);  // 最后一个参数1表示填充可用空间

    // —— 初始化 watcher —— 
  
    connect(&m_kfWatcher, &QFutureWatcher<QVector<T_KeyFrameTableViewModel::KeyFrameItem>>::finished,this, &T_Player::onKeyFramesReady);
}

T_Player::~T_Player()
{
}

// 关键帧提取完成后，更新表格模型和进度条
void T_Player::onKeyFramesReady()
{
    // 1) 拿结果
    auto items = m_kfWatcher.future().result();

    // 2) 更新模型
    auto* model = static_cast<T_KeyFrameTableViewModel*>(_tableView->model());
    model->clearData();
    for (auto& it : items) {
        model->appendData(it);
    }

    // 3) 恢复按钮/进度 & 提示
    btnExtractKeyFrame->setEnabled(true);
    if (auto mw = qobject_cast<MainWindow*>(this->window())) {
    mw->globalProgressBar()->done();
    }
    QMessageBox::information(this, "提示", "关键帧提取完成！");
}

// 提取字幕按钮点击事件处理函数
void T_Player::onExtractSubtitlesClicked()
{
    if (m_currentVideoPath.isEmpty()) {
        QMessageBox::warning(this, "提示", "请先选择视频文件！");
        return;
    }
    if (!whisper || !whisper->m_worker) {
        QMessageBox::critical(this, "错误", "Whisper 未初始化！");
        return;
    }

    // 1) 禁用按钮 + 清空旧字幕
    btnExtractSubtitles->setEnabled(false);
    if (auto mw = qobject_cast<MainWindow*>(this->window())) {
        mw->globalProgressBar()->running();
    }
    m_captionModel->clearData();

    // 2) 调用 QtConcurrent::run，让 processVideoAudio 在后台执行
    //    （WhisperWorker::processVideoAudio 会在完成后 emit processingFinished()）
    QtConcurrent::run([this] {
        whisper->m_worker->processVideoAudio(m_currentVideoPath);
    });
}

// —— 当处理完成后，这里会被调用（跨线程通过 Qt::QueuedConnection）
void T_Player::onSubtitlesReady(const QList<SegmentResult>& segments)
{
    m_captionModel->clearData();

    for (const auto& seg : segments) {
        // 1) 原始字符串，打印出来看看长啥样：
        QString raw = seg.startTime;  
        qDebug() << "【字幕原始 startTime】" << raw;

        // 2) 拆分 "起始 --> 结束"，只取左边
        QStringList parts = raw.split("-->");
        QString startStr = parts.value(0).trimmed();

        // 2) 去掉多余的 '[' ']'，并把逗号换成点
        startStr.remove('[').remove(']').replace(',', '.');
        qDebug() << "����Ļʱ����ԭʼ ֵ��" << startStr;

        // 4) 试着用几种格式去解析
        //    首选支持单/双位小时的 "h:mm:ss.zzz"
        QTime t = QTime::fromString(startStr, "h:mm:ss.zzz");
        if (!t.isValid()) {
            // 再试两位小时
            t = QTime::fromString(startStr, "hh:mm:ss.zzz");
        }
        if (!t.isValid()) {
            // 万一只有 mm:ss.zzz
            t = QTime::fromString(startStr, "m:ss.zzz");
        }
        if (!t.isValid()) {
            qWarning() << "【字幕时间解析失败】" << startStr;
            t = QTime(0,0,0);
        }

        // 5) 存到 item 里
        PlayerSubtitleItem item;
        // 把它包成一个 QDateTime（日期随意取当前），方便 model 用 timestamp.time()
        item.timestamp = QDateTime(QDate::currentDate(), t, Qt::LocalTime);
        item.content   = seg.text;

        m_captionModel->appendData(item);
    }

    // 6) 重新启用按钮 & 提示
    btnExtractSubtitles->setEnabled(true);
    if (auto mw = qobject_cast<MainWindow*>(this->window())) {
        mw->globalProgressBar()->done();
    }
    QMessageBox::information(this, "字幕提取", "字幕提取完成！");
}

//关键帧时间戳视频跳转
void T_Player::onKeyFrameClicked(const QModelIndex& index) {
    if (!index.isValid())
        return;

    // 假设时间戳存放在同一行的第1列（索引为1）
    QModelIndex timeIndex = index.sibling(index.row(), 1);
    QString timeStr = timeIndex.data(Qt::DisplayRole).toString();
    qDebug() << "点击的时间戳:" << timeStr;

    // 将时间字符串转换为 QTime 对象，格式需要与存储时一致
    QTime t = QTime::fromString(timeStr.trimmed(), "yyyy-MM-dd hh:mm:ss.zzz");

    if (!t.isValid()) {
        qDebug() << "时间字符串格式无效:" << timeStr;
        return;
    }

    // 计算从午夜开始到该时间的毫秒数
    qint64 ms = QTime(0, 0, 0).msecsTo(t);
    qDebug() << "跳转时间（毫秒）:" << ms;

    // 调用播放器跳转到该时间点（假设 _player 对象有 setPosition(qint64) 方法）
    if (_player) {
        _player->setPosition(ms);
        qDebug() << "播放器跳转到:" << ms;
        
    }
}

void T_Player::onCaptionClicked(const QModelIndex& index) {
    if (!index.isValid()) return;
    QString timeStr = index.sibling(index.row(), 0)
                        .data(Qt::DisplayRole)
                        .toString()  // e.g. "00:12:12.240"
                        .replace(',', '.');
    // 解析同上
    QTime t = QTime::fromString(timeStr, "h:mm:ss.zzz");
    if (!t.isValid()) t = QTime::fromString(timeStr, "hh:mm:ss.zzz");
    if (!t.isValid()) return;

    qint64 ms = QTime(0,0,0).msecsTo(t);
    _player->setPosition(ms);
}


